""" addons.xml generator """

import os, glob
import hashlib
import re
#import md5

import zipfile

#myFileList = []

        
class Generator:
    """
        Generates a new addons.xml file from each addons addon.xml file
        and a new addons.xml.md5 hash file. Must be run from the root of
        the checked-out repo. Only handles single depth folder structure.
    """
    
    myFileList = []

    def scandirs(self, path):
        for currentFile in glob.glob( os.path.join(path, '*') ):
            if os.path.isdir(currentFile):
    #            print currentFile
                self.scandirs(currentFile)
            else:
                self.myFileList.append(currentFile)
#                print currentFile
#            print len(self.myFileList)
    
    def __init__( self ):
        # generate files
        self._generate_addons_file()
        self._generate_md5_file()
        # notify user
        print "Finished updating addons xml and md5 files"

    def _generate_addons_file( self ):
        # addon list
        addons = os.listdir( "." )
        # final addons text
        addons_xml = u"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<addons>\n"
        # loop thru and add each addons addon.xml file
        for addon in addons:
            try:
            
                # skip any file or .svn folder
                if ( not os.path.isdir( addon ) or addon == ".svn" ): continue
                
                # create path
                _path = os.path.join( addon, "addon.xml" )
                # create path
                _path_tpl = os.path.join( addon, "addon.xml.tpl" )                
                
                v = open(addon+"_version.txt")
                version = v.read()
                v.close
                
                o = open(_path,"w")
                data = open(_path_tpl).read()
                o.write( re.sub("VERSION_REPLACE",version,data))
                o.close()
                                
                # split lines for stripping
                xml_lines = open( _path, "r" ).read().splitlines()
                # new addon
                addon_xml = ""
                # loop thru cleaning each line
                for line in xml_lines:
                    # skip encoding format line
                    if ( line.find( "<?xml" ) >= 0 ): continue
                    # add line
                    addon_xml += unicode( line.rstrip() + "\n", "UTF-8" )
                # we succeeded so add to our final addons.xml text
                addons_xml += addon_xml.rstrip() + "\n\n"
                
                #zip-ing
                self.myFileList = []
                
#                print os.path.join( addon,"")
                self.scandirs(os.path.join( addon,""))
#                print len(self.myFileList)
                zf = zipfile.ZipFile(os.path.join( addon,addon+"-"+version+".zip"), mode="w")
                
                for ffile in self.myFileList:
#                    print ffile
                    if not ffile.endswith(".zip"):
                        if not ffile.endswith(".tpl"):
                            zf.write(ffile)  
                zf.close()                                 
            except Exception, e:
                # missing or poorly formatted addon.xml
                print "Excluding %s for %s" % ( _path, e, )

        # clean and add closing tag
        addons_xml = addons_xml.strip() + u"\n</addons>\n"
        # save file
        self._save_file( addons_xml.encode( "UTF-8" ), file="addons.xml" )

    def _generate_md5_file( self ):
        try:
            # create a new md5 hash
            # s = md5.new(open( "addons.xml" ).read()).hexdigest()
            
            m = hashlib.new("md5")
            m.update(open( "addons.xml" ).read())
            s = m.hexdigest()
            
            # save file
            self._save_file( s, file="addons.xml.md5" )
        except Exception, e:
            # oops
            print "An error occurred creating addons.xml.md5 file!\n%s" % ( e, )

    def _save_file( self, data, file ):
        try:
            # write data to the file
            open( file, "w" ).write( data )
        except Exception, e:
            # oops
            print "An error occurred saving %s file!\n%s" % ( file, e, )


if ( __name__ == "__main__" ):
    # start
    Generator()